using UnityEngine; using UnityEngine.UI; using EnhancedUI.EnhancedScroller; namespace EnhancedScrollerDemos.SelectionDemo { /// /// This delegate handles the UI's button click /// /// The cell view that had the button click public delegate void SelectedDelegate(EnhancedScrollerCellView cellView); /// /// This class handles the presentation of the inventory cell view. Both the /// horizontal and vertical cell views share the same view class. The difference /// between them is layout and sprite for this example. /// public class InventoryCellView : EnhancedScrollerCellView { /// /// Reference to the underlying data driving this view /// private InventoryData _data; /// /// These are the UI elements that will be updated when the data changes /// public Image selectionPanel; public Text itemNameText; public Text itemCostText; public Text itemDamageText; public Text itemDefenseText; public Text itemWeightText; public Text itemDescriptionText; public Image image; /// /// These are the colors for the selection of the cells /// public Color selectedColor; public Color unSelectedColor; /// /// Public reference to the index of the data /// public int DataIndex { get; private set; } /// /// The handler to call when this cell's button traps a click event /// public SelectedDelegate selected; /// /// This is called if the cell is destroyed. The EnhancedScroller will /// not call this since it uses recycling, but we include it in case /// the user decides to destroy the cell anyway /// void OnDestroy() { if (_data != null) { // remove the handler from the data so // that any changes to the data won't try // to call this destroyed view's function _data.selectedChanged -= SelectedChanged; } } /// /// This function sets up the data for the cell view /// /// The index of the data /// The data to use /// Whether this view is vertical or horizontal (which will determine the sprite to use) public void SetData(int dataIndex, InventoryData data, bool isVertical) { // if there was previous data assigned to this cell view, // we need to remove the handler for the selection change if (_data != null) { _data.selectedChanged -= SelectedChanged; } // link the data to the cell view DataIndex = dataIndex; _data = data; // update the cell view's UI itemNameText.text = data.itemName; if (itemCostText != null) itemCostText.text = (data.itemCost > 0 ? data.itemCost.ToString() : "-"); if (itemDamageText != null) itemDamageText.text = (data.itemDamage > 0 ? data.itemDamage.ToString() : "-"); if (itemDefenseText != null) itemDefenseText.text = (data.itemDefense > 0 ? data.itemDefense.ToString() : "-"); if (itemWeightText != null) itemWeightText.text = (data.itemWeight > 0 ? data.itemWeight.ToString() : "-"); // the description is only shown on the vertical cell view if (isVertical) itemDescriptionText.text = data.itemDescription; // set up the sprite based on the sprite path and whether the // view is horizontal or vertical image.sprite = Resources.Load(data.spritePath + (isVertical ? "_v" : "_h")); // set up a handler so that when the data changes // the cell view will update accordingly. We only // want a single handler for this cell view, so // first we remove any previous handlers before // adding the new one _data.selectedChanged -= SelectedChanged; _data.selectedChanged += SelectedChanged; // update the selection state UI SelectedChanged(data.Selected); } /// /// This function changes the UI state when the item is /// selected or unselected. /// /// The selection state of the cell private void SelectedChanged(bool selected) { selectionPanel.color = (selected ? selectedColor : unSelectedColor); } /// /// This function is called by the cell's button click event /// public void OnSelected() { // if a handler exists for this cell, then // call it. if (selected != null) selected(this); } } }